#include "stdafx.h"
#include "detail/bmock_in_out_raw_mem_ptr.hpp"

namespace bmock {
	in_out_raw_mem_ptr::in_out_raw_mem_ptr(const char *const n,const raw_mem &rm)
		:out_arg_val(n)
		,rm_(rm)
	{}

	in_out_raw_mem_ptr::~in_out_raw_mem_ptr() {
	}

	std::string in_out_raw_mem_ptr::get_in_value(const arg_checker &chk) const {
		if(null_supplied()) return NULL_STR;
		in_out_rm_pair rmp(rm_.get_ptr(),name_,chk);
		if(rmp.first.is_empty()) return IGNORE_STR;
		return rmp.first.get_value();
	}

	std::string in_out_raw_mem_ptr::get_in_value() const {
		return rm_.get_value();
	}

	std::string in_out_raw_mem_ptr::get_out_value(const arg_checker &chk) const {
		if(null_supplied()) return NULL_STR;
		in_out_rm_pair rmp(rm_.get_ptr(),name_,chk);
		if(rmp.second.is_empty()) return IGNORE_STR;
		return rmp.second.get_value();
	}

	bool in_out_raw_mem_ptr::validate(const arg_checker &chk,const std::string &v) const {
		if(chk.check_ptr(name_,null_expected(v),null_supplied())) return true;
		if(null_expected(v)&&null_supplied()) return false;
		if(ignore(v)) return false;
		raw_mem rm(rm_.get_ptr(),v.length()/2);
		return chk.check_arg(name_,v,rm.get_value());
	}

	bool in_out_raw_mem_ptr::validate_no_msg(const arg_checker &chk,const std::string &v) const {
		if(chk.check_ptr_no_msg(name_,null_expected(v),null_supplied())) return true;
		if(null_expected(v)&&null_supplied()) return false;
		if(ignore(v)) return false;
		raw_mem rm(rm_.get_ptr(),v.length()/2);
		return chk.check_arg_no_msg(name_,v,rm.get_value());
	}

	bool in_out_raw_mem_ptr::update_out_value(const arg_checker &chk,const std::string &v) const {
		if(ignore(v)) return false;
		return rm_.set_value(name_,chk,v);
	}

	bool in_out_raw_mem_ptr::null_supplied() const {
		return (NULL==rm_.get_ptr());
	}

	void in_out_raw_mem_ptr::print(std::ostream &os) const {
		raw_mem rm(rm_.get_ptr(),std::min(rm_.get_length(),DEFAULT_PRINT_LENGTH));
		in_out_arg_value_expectation exp(rm.get_value());
		exp.print(os);
	}

	void in_out_raw_mem_ptr::update(const std::string &v,const control_tools_ptr& t,int ) const {
		bmock::location loc_;
		t->check_less_or_equal(v.length()/2,rm_.get_length(),message(RAW_MEM_LEN_CONSOLE,name_),loc_);
		rm_.set_value(v.length()/2,v.c_str());
	}
}